diff --git a/system/libraries/Loader.php b/system/libraries/Loader.php
index 6e4c594..2de2bd7 100644
--- a/system/libraries/Loader.php
+++ b/system/libraries/Loader.php
@@ -1 +1,985 @@
-<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');/** * CodeIgniter * * An open source application development framework for PHP 4.3.2 or newer * * @package		CodeIgniter * @author		Rick Ellis * @copyright	Copyright (c) 2006, EllisLab, Inc. * @license		http://www.codeigniter.com/user_guide/license.html * @link		http://www.codeigniter.com * @since		Version 1.0 * @filesource */// ------------------------------------------------------------------------/** * Loader Class * * Loads views and files * * @package		CodeIgniter * @subpackage	Libraries * @author		Rick Ellis * @category	Loader * @link		http://www.codeigniter.com/user_guide/libraries/loader.html */class CI_Loader {	// All these are set automatically. Don't mess with them.	var $_ci_ob_level;	var $_ci_view_path		= '';	var $_ci_is_php5		= FALSE;	var $_ci_is_instance 	= FALSE; // Whether we should use $this or $CI =& get_instance()	var $_ci_cached_vars	= array();	var $_ci_classes		= array();	var $_ci_models			= array();	var $_ci_helpers		= array();	var $_ci_plugins		= array();	var $_ci_scripts		= array();	var $_ci_varmap			= array('unit_test' => 'unit', 'user_agent' => 'agent');		/**	 * Constructor	 *	 * Sets the path to the view files and gets the initial output buffering level	 *	 * @access	public	 */	function CI_Loader()	{			$this->_ci_is_php5 = (floor(phpversion()) >= 5) ? TRUE : FALSE;		$this->_ci_view_path = APPPATH.'views/';		$this->_ci_ob_level  = ob_get_level();						log_message('debug', "Loader Class Initialized");	}		// --------------------------------------------------------------------		/**	 * Class Loader	 *	 * This function lets users load and instantiate classes.	 * It is designed to be called from a user's app controllers.	 *	 * @access	public	 * @param	string	the name of the class	 * @param	mixed	the optional parameters	 * @return	void	 */		function library($library = '', $params = NULL)	{				if ($library == '')		{			return FALSE;		}		if (is_array($library))		{			foreach ($library as $class)			{				$this->_ci_load_class($class, $params);			}		}		else		{			$this->_ci_load_class($library, $params);		}				$this->_ci_assign_to_models();	}	// --------------------------------------------------------------------		/**	 * Model Loader	 *	 * This function lets users load and instantiate models.	 *	 * @access	public	 * @param	string	the name of the class	 * @param	mixed	any initialization parameters	 * @return	void	 */		function model($model, $name = '', $db_conn = FALSE)	{				if (is_array($model))		{			foreach($model as $babe)			{				$this->model($babe);				}			return;		}		if ($model == '')		{			return;		}			// Is the model in a sub-folder? If so, parse out the filename and path.		if (strpos($model, '/') === FALSE)		{			$path = '';		}		else		{			$x = explode('/', $model);			$model = end($x);						unset($x[count($x)-1]);			$path = implode('/', $x).'/';		}			if ($name == '')		{			$name = $model;		}				if (in_array($name, $this->_ci_models, TRUE))		{			return;		}				$CI =& get_instance();		if (isset($CI->$name))		{			show_error('The model name you are loading is the name of a resource that is already being used: '.$name);		}			$model = strtolower($model);				if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))		{			show_error('Unable to locate the model you have specified: '.$model);		}						if ($db_conn !== FALSE AND ! class_exists('CI_DB'))		{			if ($db_conn === TRUE)				$db_conn = '';					$CI->load->database($db_conn, FALSE, TRUE);		}			if ( ! class_exists('Model'))		{			require_once(BASEPATH.'libraries/Model'.EXT);		}		require_once(APPPATH.'models/'.$path.$model.EXT);		$model = ucfirst($model);						$CI->$name = new $model();		$CI->$name->_assign_libraries();				$this->_ci_models[] = $name;		}			// --------------------------------------------------------------------		/**	 * Database Loader	 *	 * @access	public	 * @param	string	the DB credentials	 * @param	bool	whether to return the DB object	 * @param	bool	whether to enable active record (this allows us to override the config setting)	 * @return	object	 */		function database($params = '', $return = FALSE, $active_record = FALSE)	{		// Do we even need to load the database class?		if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE)		{			return FALSE;		}				require_once(BASEPATH.'database/DB'.EXT);		if ($return === TRUE)		{			return DB($params, $active_record);		}		// Grab the super object		$CI =& get_instance();				// Initialize the db variable.  Needed to prevent   		// reference errors with some configurations		$CI->db = '';				// Load the DB class		$CI->db =& DB($params, $active_record);					// Assign the DB object to any existing models		$this->_ci_assign_to_models();	}		// --------------------------------------------------------------------	/**	 * Load the Utilities Class	 *	 * @access	public	 * @return	string			 */			function dbutil()	{		if ( ! class_exists('CI_DB'))		{			$this->database();		}				$CI =& get_instance();			require_once(BASEPATH.'database/DB_utility'.EXT);		require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility'.EXT);		$class = 'CI_DB_'.$CI->db->dbdriver.'_utility';		$CI->dbutil = new $class();		$CI->load->_ci_assign_to_models();	}		// --------------------------------------------------------------------		/**	 * Load View	 *	 * This function is used to load a "view" file.  It has three parameters:	 *	 * 1. The name of the "view" file to be included.	 * 2. An associative array of data to be extracted for use in the view.	 * 3. TRUE/FALSE - whether to return the data or load it.  In	 * some cases it's advantageous to be able to return data so that	 * a developer can process it in some way.	 *	 * @access	public	 * @param	string	 * @param	array	 * @param	bool	 * @return	void	 */	function view($view, $vars = array(), $return = FALSE)	{		return $this->_ci_load(array('view' => $view, 'vars' => $this->_ci_object_to_array($vars), 'return' => $return));	}		// --------------------------------------------------------------------		/**	 * Load File	 *	 * This is a generic file loader	 *	 * @access	public	 * @param	string	 * @param	bool	 * @return	string	 */	function file($path, $return = FALSE)	{		return $this->_ci_load(array('path' => $path, 'return' => $return));	}		// --------------------------------------------------------------------		/**	 * Set Variables	 *	 * Once variables are set they become available within	 * the controller class and its "view" files.	 *	 * @access	public	 * @param	array	 * @return	void	 */	function vars($vars = array())	{		$vars = $this->_ci_object_to_array($vars);			if (is_array($vars) AND count($vars) > 0)		{			foreach ($vars as $key => $val)			{				$this->_ci_cached_vars[$key] = $val;			}		}	}		// --------------------------------------------------------------------		/**	 * Load Helper	 *	 * This function loads the specified helper file.	 *	 * @access	public	 * @param	mixed	 * @return	void	 */	function helper($helpers = array())	{		if ( ! is_array($helpers))		{			$helpers = array($helpers);		}			foreach ($helpers as $helper)		{					$helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper');					if (isset($this->_ci_helpers[$helper]))			{				continue;			}			if (file_exists(APPPATH.'helpers/'.$helper.EXT))			{ 				include_once(APPPATH.'helpers/'.$helper.EXT);			}			else			{						if (file_exists(BASEPATH.'helpers/'.$helper.EXT))				{					include(BASEPATH.'helpers/'.$helper.EXT);				}				else				{					show_error('Unable to load the requested file: helpers/'.$helper.EXT);				}			}			$this->_ci_helpers[$helper] = TRUE;					}				log_message('debug', 'Helpers loaded: '.implode(', ', $helpers));	}		// --------------------------------------------------------------------		/**	 * Load Helpers	 *	 * This is simply an alias to the above function in case the	 * user has written the plural form of this function.	 *	 * @access	public	 * @param	array	 * @return	void	 */	function helpers($helpers = array())	{		$this->helper($helpers);	}		// --------------------------------------------------------------------		/**	 * Load Plugin	 *	 * This function loads the specified plugin.	 *	 * @access	public	 * @param	array	 * @return	void	 */	function plugin($plugins = array())	{		if ( ! is_array($plugins))		{			$plugins = array($plugins);		}			foreach ($plugins as $plugin)		{				$plugin = strtolower(str_replace(EXT, '', str_replace('_plugin.', '', $plugin)).'_pi');					if (isset($this->_ci_plugins[$plugin]))			{				continue;			}			if (file_exists(APPPATH.'plugins/'.$plugin.EXT))			{				include(APPPATH.'plugins/'.$plugin.EXT);				}			else			{				if (file_exists(BASEPATH.'plugins/'.$plugin.EXT))				{					include(BASEPATH.'plugins/'.$plugin.EXT);					}				else				{					show_error('Unable to load the requested file: plugins/'.$plugin.EXT);				}			}						$this->_ci_plugins[$plugin] = TRUE;		}				log_message('debug', 'Plugins loaded: '.implode(', ', $plugins));	}	// --------------------------------------------------------------------		/**	 * Load Plugins	 *	 * This is simply an alias to the above function in case the	 * user has written the plural form of this function.	 *	 * @access	public	 * @param	array	 * @return	void	 */	function plugins($plugins = array())	{		$this->plugin($plugins);	}	// --------------------------------------------------------------------		/**	 * Load Script	 *	 * This function loads the specified include file from the	 * application/scripts/ folder.	 *	 * NOTE:  This feature has been deprecated but it will remain available	 * for legacy users.	 *	 * @access	public	 * @param	array	 * @return	void	 */	function script($scripts = array())	{		if ( ! is_array($scripts))		{			$scripts = array($scripts);		}			foreach ($scripts as $script)		{				$script = strtolower(str_replace(EXT, '', $script));			if (isset($this->_ci_scripts[$script]))			{				continue;			}					if ( ! file_exists(APPPATH.'scripts/'.$script.EXT))			{				show_error('Unable to load the requested script: scripts/'.$script.EXT);			}						include(APPPATH.'scripts/'.$script.EXT);		}				log_message('debug', 'Scripts loaded: '.implode(', ', $scripts));	}			// --------------------------------------------------------------------		/**	 * Loads a language file	 *	 * @access	public	 * @param	array	 * @param	string	 * @return	void	 */	function language($file = array(), $lang = '')	{		$CI =& get_instance();		if ( ! is_array($file))		{			$file = array($file);		}		foreach ($file as $langfile)		{				$CI->lang->load($langfile, $lang);		}	}	/**	 * Loads language files for scaffolding	 *	 * @access	public	 * @param	string	 * @return	arra	 */	function scaffold_language($file = '', $lang = '', $return = FALSE)	{		$CI =& get_instance();		return $CI->lang->load($file, $lang, $return);	}		// --------------------------------------------------------------------		/**	 * Loads a config file	 *	 * @access	public	 * @param	string	 * @return	void	 */	function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)	{					$CI =& get_instance();		$CI->config->load($file, $use_sections, $fail_gracefully);	}	// --------------------------------------------------------------------		/**	 * Scaffolding Loader	 *	 * This initializing function works a bit different than the	 * others. It doesn't load the class.  Instead, it simply	 * sets a flag indicating that scaffolding is allowed to be	 * used.  The actual scaffolding function below is	 * called by the front controller based on whether the	 * second segment of the URL matches the "secret" scaffolding	 * word stored in the application/config/routes.php	 *	 * @access	public	 * @param	string	 * @return	void	 */		function scaffolding($table = '')	{				if ($table === FALSE)		{			show_error('You must include the name of the table you would like to access when you initialize scaffolding');		}				$CI =& get_instance();		$CI->_ci_scaffolding = TRUE;		$CI->_ci_scaff_table = $table;	}	// --------------------------------------------------------------------			/**	 * Loader	 *	 * This function is used to load views and files.	 *	 * @access	private	 * @param	array	 * @return	void	 */	function _ci_load($data)	{		// Set the default data variables		foreach (array('view', 'vars', 'path', 'return') as $val)		{			$$val = ( ! isset($data[$val])) ? FALSE : $data[$val];		}		// Set the path to the requested file		if ($path == '')		{			$ext = pathinfo($view, PATHINFO_EXTENSION);			$file = ($ext == '') ? $view.EXT : $view;			$path = $this->_ci_view_path.$file;		}		else		{			$x = explode('/', $path);			$file = end($x);		}				if ( ! file_exists($path))		{			show_error('Unable to load the requested file: '.$file);		}			// This allows anything loaded using $this->load (views, files, etc.)		// to become accessible from within the Controller and Model functions.		// Only needed when running PHP 5				if ($this->_ci_is_instance())		{			$CI =& get_instance();			foreach (get_object_vars($CI) as $key => $var)			{				if ( ! isset($this->$key))				{					$this->$key =& $CI->$key;				}			}		}				/*		 * Extract and cache variables		 *		 * You can either set variables using the dedicated $this->load_vars()		 * function or via the second parameter of this function. We'll merge		 * the two types and cache them so that views that are embedded within		 * other views can have access to these variables.		 */			if (is_array($vars))		{			$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $vars);		}		extract($this->_ci_cached_vars);						/*		 * Buffer the output		 *		 * We buffer the output for two reasons:		 * 1. Speed. You get a significant speed boost.		 * 2. So that the final rendered template can be		 * post-processed by the output class.  Why do we		 * need post processing?  For one thing, in order to		 * show the elapsed page load time.  Unless we		 * can intercept the content right before it's sent to		 * the browser and then stop the timer it won't be accurate.		 */		ob_start();						// If the PHP installation does not support short tags we'll		// do a little string replacement, changing the short tags		// to standard PHP echo statements.				if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)		{			echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($path))).'<?php ');		}		else		{			include($path);		}				log_message('debug', 'File loaded: '.$path);				// Return the file data if requested		if ($return === TRUE)		{					$buffer = ob_get_contents();			@ob_end_clean();			return $buffer;		}		/*		 * Flush the buffer... or buff the flusher?		 *		 * In order to permit views to be nested within		 * other views, we need to flush the content back out whenever		 * we are beyond the first level of output buffering so that		 * it can be seen and included properly by the first included		 * template and any subsequent ones. Oy!		 *		 */			if (ob_get_level() > $this->_ci_ob_level + 1)		{			ob_end_flush();		}		else		{			// PHP 4 requires that we use a global			global $OUT;			$OUT->set_output(ob_get_contents());			@ob_end_clean();		}	}	// --------------------------------------------------------------------	/**	 * Load class	 *	 * This function loads the requested class.	 *	 * @access	private	 * @param 	string	the item that is being loaded	 * @param	mixed	any additional parameters	 * @return 	void	 */	function _ci_load_class($class, $params = NULL)	{			// Get the class name		$class = str_replace(EXT, '', $class);		// We'll test for both lowercase and capitalized versions of the file name		foreach (array(ucfirst($class), strtolower($class)) as $class)		{			$subclass = APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT;			// Is this a class extension request?						if (file_exists($subclass))			{				$baseclass = BASEPATH.'libraries/'.ucfirst($class).EXT;								if ( ! file_exists($baseclass))				{					log_message('error', "Unable to load the requested class: ".$class);					show_error("Unable to load the requested class: ".$class);				}				// Safety:  Was the class already loaded by a previous call?				if (in_array($subclass, $this->_ci_classes))				{					$is_duplicate = TRUE;					log_message('debug', $class." class already loaded. Second attempt ignored.");					return;				}					include($baseclass);								include($subclass);				$this->_ci_classes[] = $subclass;					return $this->_ci_init_class($class, config_item('subclass_prefix'), $params);						}					// Lets search for the requested library file and load it.			$is_duplicate = FALSE;					for ($i = 1; $i < 3; $i++)			{				$path = ($i % 2) ? APPPATH : BASEPATH;					$filepath = $path.'libraries/'.$class.EXT;								// Does the file exist?  No?  Bummer...				if ( ! file_exists($filepath))				{					continue;				}								// Safety:  Was the class already loaded by a previous call?				if (in_array($filepath, $this->_ci_classes))				{					$is_duplicate = TRUE;					log_message('debug', $class." class already loaded. Second attempt ignored.");					return;				}								include($filepath);				$this->_ci_classes[] = $filepath;				return $this->_ci_init_class($class, '', $params);			}		} // END FOREACH				// If we got this far we were unable to find the requested class.		// We do not issue errors if the load call failed due to a duplicate request		if ($is_duplicate == FALSE)		{			log_message('error', "Unable to load the requested class: ".$class);			show_error("Unable to load the requested class: ".$class);		}	}		// --------------------------------------------------------------------	/**	 * Instantiates a class	 *	 * @access	private	 * @param	string	 * @param	string	 * @return	null	 */	function _ci_init_class($class, $prefix = '', $config = FALSE)	{			// Is there an associated config file for this class?		if ($config === NULL)		{			$config = NULL;			if (file_exists(APPPATH.'config/'.$class.EXT))			{				include(APPPATH.'config/'.$class.EXT);			}		}				if ($prefix == '')		{			$name = (class_exists('CI_'.$class)) ? 'CI_'.$class : $class;		}		else		{			$name = $prefix.$class;		}				// Set the variable name we will assign the class to		$class = strtolower($class);					$classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];						// Instantiate the class				$CI =& get_instance();		if ($config !== NULL)		{			$CI->$classvar = new $name($config);		}		else		{					$CI->$classvar = new $name;		}		} 			// --------------------------------------------------------------------		/**	 * Autoloader	 *	 * The config/autoload.php file contains an array that permits sub-systems,	 * libraries, plugins, and helpers to be loaded automatically.	 *	 * @access	private	 * @param	array	 * @return	void	 */	function _ci_autoloader()	{			include(APPPATH.'config/autoload'.EXT);				if ( ! isset($autoload))		{			return FALSE;		}				// Load any custom config file		if (count($autoload['config']) > 0)		{						$CI =& get_instance();			foreach ($autoload['config'] as $key => $val)			{				$CI->config->load($val);			}		}				// Autoload plugins, helpers, scripts and languages		foreach (array('helper', 'plugin', 'script', 'language') as $type)		{						if (isset($autoload[$type]) AND count($autoload[$type]) > 0)			{				$this->$type($autoload[$type]);			}				}		// Autoload models		if (isset($autoload['model']))		{			$this->model($autoload['model']);		}		// A little tweak to remain backward compatible		// The $autoload['core'] item was deprecated		if ( ! isset($autoload['libraries']))		{			$autoload['libraries'] = $autoload['core'];		}				// Load libraries		if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)		{			// Load the database driver.			if (in_array('database', $autoload['libraries']))			{				$this->database();				$autoload['libraries'] = array_diff($autoload['libraries'], array('database'));			}			// Load scaffolding			if (in_array('scaffolding', $autoload['libraries']))			{				$this->scaffolding();				$autoload['libraries'] = array_diff($autoload['libraries'], array('scaffolding'));			}					// Load all other libraries			foreach ($autoload['libraries'] as $item)			{				$this->library($item);			}			// Load the model class.			if (in_array('model', $autoload['libraries']))			{				$this->model();				$autoload['libraries'] = array_diff($autoload['libraries'], array('model'));			}		}			}		// --------------------------------------------------------------------	/**	 * Assign to Models	 *	 * Makes sure that anything loaded by the loader class (libraries, plugins, etc.)	 * will be available to models, if any exist.	 *	 * @access	private	 * @param	object	 * @return	array	 */	function _ci_assign_to_models()	{		if (count($this->_ci_models) == 0)		{			return;		}			if ($this->_ci_is_instance())		{			$CI =& get_instance();			foreach ($this->_ci_models as $model)			{							$CI->$model->_assign_libraries();			}		}		else		{					foreach ($this->_ci_models as $model)			{							$this->$model->_assign_libraries();			}		}	}  		// --------------------------------------------------------------------	/**	 * Object to Array	 *	 * Takes an object as input and converts the class variables to array key/vals	 *	 * @access	private	 * @param	object	 * @return	array	 */	function _ci_object_to_array($object)	{		return (is_object($object)) ? get_object_vars($object) : $object;	}	// --------------------------------------------------------------------	/**	 * Determines whether we should use the CI instance or $this	 *	 * @access	private	 * @return	bool	 */	function _ci_is_instance()	{		if ($this->_ci_is_php5 == TRUE)		{			return TRUE;		}			global $CI;		return (is_object($CI)) ? TRUE : FALSE;	}	}?>
\ No newline at end of file
+<?php  if (!defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		Rick Ellis
+ * @copyright	Copyright (c) 2006, EllisLab, Inc.
+ * @license		http://www.codeigniter.com/user_guide/license.html
+ * @link		http://www.codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Loader Class
+ *
+ * Loads views and files
+ *
+ * @package		CodeIgniter
+ * @subpackage	Libraries
+ * @author		Rick Ellis
+ * @category	Loader
+ * @link		http://www.codeigniter.com/user_guide/libraries/loader.html
+ */
+class CI_Loader {
+
+	// All these are set automatically. Don't mess with them.
+	var $_ci_ob_level;
+	var $_ci_view_path		= '';
+	var $_ci_is_php5		= FALSE;
+	var $_ci_is_instance 	= FALSE; // Whether we should use $this or $CI =& get_instance()
+	var $_ci_cached_vars	= array();
+	var $_ci_classes		= array();
+	var $_ci_models			= array();
+	var $_ci_helpers		= array();
+	var $_ci_plugins		= array();
+	var $_ci_scripts		= array();
+	var $_ci_varmap			= array('unit_test' => 'unit', 'user_agent' => 'agent');
+	
+
+	/**
+	 * Constructor
+	 *
+	 * Sets the path to the view files and gets the initial output buffering level
+	 *
+	 * @access	public
+	 */
+	function CI_Loader()
+	{	
+		$this->_ci_is_php5 = (floor(phpversion()) >= 5) ? TRUE : FALSE;
+		$this->_ci_view_path = APPPATH.'views/';
+		$this->_ci_ob_level  = ob_get_level();
+				
+		log_message('debug', "Loader Class Initialized");
+	}
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Class Loader
+	 *
+	 * This function lets users load and instantiate classes.
+	 * It is designed to be called from a user's app controllers.
+	 *
+	 * @access	public
+	 * @param	string	the name of the class
+	 * @param	mixed	the optional parameters
+	 * @return	void
+	 */	
+	function library($library = '', $params = NULL)
+	{		
+		if ($library == '')
+		{
+			return FALSE;
+		}
+
+		if (is_array($library))
+		{
+			foreach ($library as $class)
+			{
+				$this->_ci_load_class($class, $params);
+			}
+		}
+		else
+		{
+			$this->_ci_load_class($library, $params);
+		}
+		
+		$this->_ci_assign_to_models();
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Model Loader
+	 *
+	 * This function lets users load and instantiate models.
+	 *
+	 * @access	public
+	 * @param	string	the name of the class
+	 * @param	mixed	any initialization parameters
+	 * @return	void
+	 */	
+	function model($model, $name = '', $db_conn = FALSE)
+	{		
+		if (is_array($model))
+		{
+			foreach($model as $babe)
+			{
+				$this->model($babe);	
+			}
+			return;
+		}
+
+		if ($model == '')
+		{
+			return;
+		}
+	
+		// Is the model in a sub-folder? If so, parse out the filename and path.
+		if (strpos($model, '/') === FALSE)
+		{
+			$path = '';
+		}
+		else
+		{
+			$x = explode('/', $model);
+			$model = end($x);			
+			unset($x[count($x)-1]);
+			$path = implode('/', $x).'/';
+		}
+	
+		if ($name == '')
+		{
+			$name = $model;
+		}
+		
+		if (in_array($name, $this->_ci_models, TRUE))
+		{
+			return;
+		}
+		
+		$CI =& get_instance();
+		if (isset($CI->$name))
+		{
+			show_error('The model name you are loading is the name of a resource that is already being used: '.$name);
+		}
+	
+		$model = strtolower($model);
+		
+		if ( ! file_exists(APPPATH.'models/'.$path.$model.EXT))
+		{
+			show_error('Unable to locate the model you have specified: '.$model);
+		}
+				
+		if ($db_conn !== FALSE AND ! class_exists('CI_DB'))
+		{
+			if ($db_conn === TRUE)
+				$db_conn = '';
+		
+			$CI->load->database($db_conn, FALSE, TRUE);
+		}
+	
+		if ( ! class_exists('Model'))
+		{
+			require_once(BASEPATH.'libraries/Model'.EXT);
+		}
+
+		require_once(APPPATH.'models/'.$path.$model.EXT);
+
+		$model = ucfirst($model);
+				
+		$CI->$name = new $model();
+		$CI->$name->_assign_libraries();
+		
+		$this->_ci_models[] = $name;	
+	}
+		
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Database Loader
+	 *
+	 * @access	public
+	 * @param	string	the DB credentials
+	 * @param	bool	whether to return the DB object
+	 * @param	bool	whether to enable active record (this allows us to override the config setting)
+	 * @return	object
+	 */	
+	function database($params = '', $return = FALSE, $active_record = FALSE)
+	{
+		// Do we even need to load the database class?
+		if (class_exists('CI_DB') AND $return == FALSE AND $active_record == FALSE)
+		{
+			return FALSE;
+		}	
+	
+		require_once(BASEPATH.'database/DB'.EXT);
+
+		if ($return === TRUE)
+		{
+			return DB($params, $active_record);
+		}
+
+		// Grab the super object
+		$CI =& get_instance();
+		
+		// Initialize the db variable.  Needed to prevent   
+		// reference errors with some configurations
+		$CI->db = '';
+		
+		// Load the DB class
+		$CI->db =& DB($params, $active_record);	
+		
+		// Assign the DB object to any existing models
+		$this->_ci_assign_to_models();
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Load the Utilities Class
+	 *
+	 * @access	public
+	 * @return	string		
+	 */		
+	function dbutil()
+	{
+		if ( ! class_exists('CI_DB'))
+		{
+			$this->database();
+		}
+		
+		$CI =& get_instance();
+	
+		require_once(BASEPATH.'database/DB_utility'.EXT);
+		require_once(BASEPATH.'database/drivers/'.$CI->db->dbdriver.'/'.$CI->db->dbdriver.'_utility'.EXT);
+		$class = 'CI_DB_'.$CI->db->dbdriver.'_utility';
+
+		$CI->dbutil = new $class();
+		$CI->load->_ci_assign_to_models();
+	}
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Load View
+	 *
+	 * This function is used to load a "view" file.  It has three parameters:
+	 *
+	 * 1. The name of the "view" file to be included.
+	 * 2. An associative array of data to be extracted for use in the view.
+	 * 3. TRUE/FALSE - whether to return the data or load it.  In
+	 * some cases it's advantageous to be able to return data so that
+	 * a developer can process it in some way.
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	array
+	 * @param	bool
+	 * @return	void
+	 */
+	function view($view, $vars = array(), $return = FALSE)
+	{
+		return $this->_ci_load(array('view' => $view, 'vars' => $this->_ci_object_to_array($vars), 'return' => $return));
+	}
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Load File
+	 *
+	 * This is a generic file loader
+	 *
+	 * @access	public
+	 * @param	string
+	 * @param	bool
+	 * @return	string
+	 */
+	function file($path, $return = FALSE)
+	{
+		return $this->_ci_load(array('path' => $path, 'return' => $return));
+	}
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Set Variables
+	 *
+	 * Once variables are set they become available within
+	 * the controller class and its "view" files.
+	 *
+	 * @access	public
+	 * @param	array
+	 * @return	void
+	 */
+	function vars($vars = array())
+	{
+		$vars = $this->_ci_object_to_array($vars);
+	
+		if (is_array($vars) AND count($vars) > 0)
+		{
+			foreach ($vars as $key => $val)
+			{
+				$this->_ci_cached_vars[$key] = $val;
+			}
+		}
+	}
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Load Helper
+	 *
+	 * This function loads the specified helper file.
+	 *
+	 * @access	public
+	 * @param	mixed
+	 * @return	void
+	 */
+	function helper($helpers = array())
+	{
+		if ( ! is_array($helpers))
+		{
+			$helpers = array($helpers);
+		}
+	
+		foreach ($helpers as $helper)
+		{		
+			$helper = strtolower(str_replace(EXT, '', str_replace('_helper', '', $helper)).'_helper');
+		
+			if (isset($this->_ci_helpers[$helper]))
+			{
+				continue;
+			}
+
+			if (file_exists(APPPATH.'helpers/'.$helper.EXT))
+			{ 
+				include_once(APPPATH.'helpers/'.$helper.EXT);
+			}
+			else
+			{		
+				if (file_exists(BASEPATH.'helpers/'.$helper.EXT))
+				{
+					include(BASEPATH.'helpers/'.$helper.EXT);
+				}
+				else
+				{
+					show_error('Unable to load the requested file: helpers/'.$helper.EXT);
+				}
+			}
+
+			$this->_ci_helpers[$helper] = TRUE;
+			
+		}
+		
+		log_message('debug', 'Helpers loaded: '.implode(', ', $helpers));
+	}
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Load Helpers
+	 *
+	 * This is simply an alias to the above function in case the
+	 * user has written the plural form of this function.
+	 *
+	 * @access	public
+	 * @param	array
+	 * @return	void
+	 */
+	function helpers($helpers = array())
+	{
+		$this->helper($helpers);
+	}
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Load Plugin
+	 *
+	 * This function loads the specified plugin.
+	 *
+	 * @access	public
+	 * @param	array
+	 * @return	void
+	 */
+	function plugin($plugins = array())
+	{
+		if ( ! is_array($plugins))
+		{
+			$plugins = array($plugins);
+		}
+	
+		foreach ($plugins as $plugin)
+		{	
+			$plugin = strtolower(str_replace(EXT, '', str_replace('_plugin.', '', $plugin)).'_pi');		
+
+			if (isset($this->_ci_plugins[$plugin]))
+			{
+				continue;
+			}
+
+			if (file_exists(APPPATH.'plugins/'.$plugin.EXT))
+			{
+				include(APPPATH.'plugins/'.$plugin.EXT);	
+			}
+			else
+			{
+				if (file_exists(BASEPATH.'plugins/'.$plugin.EXT))
+				{
+					include(BASEPATH.'plugins/'.$plugin.EXT);	
+				}
+				else
+				{
+					show_error('Unable to load the requested file: plugins/'.$plugin.EXT);
+				}
+			}
+			
+			$this->_ci_plugins[$plugin] = TRUE;
+		}
+		
+		log_message('debug', 'Plugins loaded: '.implode(', ', $plugins));
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Load Plugins
+	 *
+	 * This is simply an alias to the above function in case the
+	 * user has written the plural form of this function.
+	 *
+	 * @access	public
+	 * @param	array
+	 * @return	void
+	 */
+	function plugins($plugins = array())
+	{
+		$this->plugin($plugins);
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Load Script
+	 *
+	 * This function loads the specified include file from the
+	 * application/scripts/ folder.
+	 *
+	 * NOTE:  This feature has been deprecated but it will remain available
+	 * for legacy users.
+	 *
+	 * @access	public
+	 * @param	array
+	 * @return	void
+	 */
+	function script($scripts = array())
+	{
+		if ( ! is_array($scripts))
+		{
+			$scripts = array($scripts);
+		}
+	
+		foreach ($scripts as $script)
+		{	
+			$script = strtolower(str_replace(EXT, '', $script));
+
+			if (isset($this->_ci_scripts[$script]))
+			{
+				continue;
+			}
+		
+			if ( ! file_exists(APPPATH.'scripts/'.$script.EXT))
+			{
+				show_error('Unable to load the requested script: scripts/'.$script.EXT);
+			}
+			
+			include(APPPATH.'scripts/'.$script.EXT);
+		}
+		
+		log_message('debug', 'Scripts loaded: '.implode(', ', $scripts));
+	}
+		
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Loads a language file
+	 *
+	 * @access	public
+	 * @param	array
+	 * @param	string
+	 * @return	void
+	 */
+	function language($file = array(), $lang = '')
+	{
+		$CI =& get_instance();
+
+		if ( ! is_array($file))
+		{
+			$file = array($file);
+		}
+
+		foreach ($file as $langfile)
+		{	
+			$CI->lang->load($langfile, $lang);
+		}
+	}
+
+	/**
+	 * Loads language files for scaffolding
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	arra
+	 */
+	function scaffold_language($file = '', $lang = '', $return = FALSE)
+	{
+		$CI =& get_instance();
+		return $CI->lang->load($file, $lang, $return);
+	}
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Loads a config file
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	void
+	 */
+	function config($file = '', $use_sections = FALSE, $fail_gracefully = FALSE)
+	{			
+		$CI =& get_instance();
+		$CI->config->load($file, $use_sections, $fail_gracefully);
+	}
+
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Scaffolding Loader
+	 *
+	 * This initializing function works a bit different than the
+	 * others. It doesn't load the class.  Instead, it simply
+	 * sets a flag indicating that scaffolding is allowed to be
+	 * used.  The actual scaffolding function below is
+	 * called by the front controller based on whether the
+	 * second segment of the URL matches the "secret" scaffolding
+	 * word stored in the application/config/routes.php
+	 *
+	 * @access	public
+	 * @param	string
+	 * @return	void
+	 */	
+	function scaffolding($table = '')
+	{		
+		if ($table === FALSE)
+		{
+			show_error('You must include the name of the table you would like to access when you initialize scaffolding');
+		}
+		
+		$CI =& get_instance();
+		$CI->_ci_scaffolding = TRUE;
+		$CI->_ci_scaff_table = $table;
+	}
+
+	// --------------------------------------------------------------------
+		
+	/**
+	 * Loader
+	 *
+	 * This function is used to load views and files.
+	 *
+	 * @access	private
+	 * @param	array
+	 * @return	void
+	 */
+	function _ci_load($data)
+	{
+		// Set the default data variables
+		foreach (array('view', 'vars', 'path', 'return') as $val)
+		{
+			$$val = ( ! isset($data[$val])) ? FALSE : $data[$val];
+		}
+
+		// Set the path to the requested file
+		if ($path == '')
+		{
+			$ext = pathinfo($view, PATHINFO_EXTENSION);
+			$file = ($ext == '') ? $view.EXT : $view;
+			$path = $this->_ci_view_path.$file;
+		}
+		else
+		{
+			$x = explode('/', $path);
+			$file = end($x);
+		}
+		
+		if ( ! file_exists($path))
+		{
+			show_error('Unable to load the requested file: '.$file);
+		}
+	
+		// This allows anything loaded using $this->load (views, files, etc.)
+		// to become accessible from within the Controller and Model functions.
+		// Only needed when running PHP 5
+		
+		if ($this->_ci_is_instance())
+		{
+			$CI =& get_instance();
+			foreach (get_object_vars($CI) as $key => $var)
+			{
+				if ( ! isset($this->$key))
+				{
+					$this->$key =& $CI->$key;
+				}
+			}
+		}
+		
+		/*
+		 * Extract and cache variables
+		 *
+		 * You can either set variables using the dedicated $this->load_vars()
+		 * function or via the second parameter of this function. We'll merge
+		 * the two types and cache them so that views that are embedded within
+		 * other views can have access to these variables.
+		 */	
+		if (is_array($vars))
+		{
+			$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $vars);
+		}
+		extract($this->_ci_cached_vars);
+				
+		/*
+		 * Buffer the output
+		 *
+		 * We buffer the output for two reasons:
+		 * 1. Speed. You get a significant speed boost.
+		 * 2. So that the final rendered template can be
+		 * post-processed by the output class.  Why do we
+		 * need post processing?  For one thing, in order to
+		 * show the elapsed page load time.  Unless we
+		 * can intercept the content right before it's sent to
+		 * the browser and then stop the timer it won't be accurate.
+		 */
+		ob_start();
+				
+		// If the PHP installation does not support short tags we'll
+		// do a little string replacement, changing the short tags
+		// to standard PHP echo statements.
+		
+		if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
+		{
+			echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($path))).'<?php ');
+		}
+		else
+		{
+			include($path);
+		}
+		
+		log_message('debug', 'File loaded: '.$path);
+		
+		// Return the file data if requested
+		if ($return === TRUE)
+		{		
+			$buffer = ob_get_contents();
+			@ob_end_clean();
+			return $buffer;
+		}
+
+		/*
+		 * Flush the buffer... or buff the flusher?
+		 *
+		 * In order to permit views to be nested within
+		 * other views, we need to flush the content back out whenever
+		 * we are beyond the first level of output buffering so that
+		 * it can be seen and included properly by the first included
+		 * template and any subsequent ones. Oy!
+		 *
+		 */	
+		if (ob_get_level() > $this->_ci_ob_level + 1)
+		{
+			ob_end_flush();
+		}
+		else
+		{
+			// PHP 4 requires that we use a global
+			global $OUT;
+			$OUT->set_output(ob_get_contents());
+			@ob_end_clean();
+		}
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Load class
+	 *
+	 * This function loads the requested class.
+	 *
+	 * @access	private
+	 * @param 	string	the item that is being loaded
+	 * @param	mixed	any additional parameters
+	 * @return 	void
+	 */
+	function _ci_load_class($class, $params = NULL)
+	{	
+		// Get the class name
+		$class = str_replace(EXT, '', $class);
+
+		// We'll test for both lowercase and capitalized versions of the file name
+		foreach (array(ucfirst($class), strtolower($class)) as $class)
+		{
+			$subclass = APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT;
+
+			// Is this a class extension request?			
+			if (file_exists($subclass))
+			{
+				$baseclass = BASEPATH.'libraries/'.ucfirst($class).EXT;
+				
+				if ( ! file_exists($baseclass))
+				{
+					log_message('error', "Unable to load the requested class: ".$class);
+					show_error("Unable to load the requested class: ".$class);
+				}
+
+				// Safety:  Was the class already loaded by a previous call?
+				if (in_array($subclass, $this->_ci_classes))
+				{
+					$is_duplicate = TRUE;
+					log_message('debug', $class." class already loaded. Second attempt ignored.");
+					return;
+				}
+	
+				include($baseclass);				
+				include($subclass);
+				$this->_ci_classes[] = $subclass;
+	
+				return $this->_ci_init_class($class, config_item('subclass_prefix'), $params);			
+			}
+		
+			// Lets search for the requested library file and load it.
+			$is_duplicate = FALSE;		
+			for ($i = 1; $i < 3; $i++)
+			{
+				$path = ($i % 2) ? APPPATH : BASEPATH;	
+				$filepath = $path.'libraries/'.$class.EXT;
+				
+				// Does the file exist?  No?  Bummer...
+				if ( ! file_exists($filepath))
+				{
+					continue;
+				}
+				
+				// Safety:  Was the class already loaded by a previous call?
+				if (in_array($filepath, $this->_ci_classes))
+				{
+					$is_duplicate = TRUE;
+					log_message('debug', $class." class already loaded. Second attempt ignored.");
+					return;
+				}
+				
+				include($filepath);
+				$this->_ci_classes[] = $filepath;
+				return $this->_ci_init_class($class, '', $params);
+			}
+		} // END FOREACH
+		
+		// If we got this far we were unable to find the requested class.
+		// We do not issue errors if the load call failed due to a duplicate request
+		if ($is_duplicate == FALSE)
+		{
+			log_message('error', "Unable to load the requested class: ".$class);
+			show_error("Unable to load the requested class: ".$class);
+		}
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Instantiates a class
+	 *
+	 * @access	private
+	 * @param	string
+	 * @param	string
+	 * @return	null
+	 */
+	function _ci_init_class($class, $prefix = '', $config = FALSE)
+	{	
+		// Is there an associated config file for this class?
+		if ($config === NULL)
+		{
+			if (file_exists(APPPATH.'config/'.$class.EXT))
+			{
+				include(APPPATH.'config/'.$class.EXT);
+			}
+		}
+		
+		if ($prefix == '')
+		{
+			$name = (class_exists('CI_'.$class)) ? 'CI_'.$class : $class;
+		}
+		else
+		{
+			$name = $prefix.$class;
+		}
+		
+		// Set the variable name we will assign the class to
+		$class = strtolower($class);			
+		$classvar = ( ! isset($this->_ci_varmap[$class])) ? $class : $this->_ci_varmap[$class];
+				
+		// Instantiate the class		
+		$CI =& get_instance();
+		if ($config !== NULL)
+		{
+			$CI->$classvar = new $name($config);
+		}
+		else
+		{		
+			$CI->$classvar = new $name;
+		}	
+	} 	
+	
+	// --------------------------------------------------------------------
+	
+	/**
+	 * Autoloader
+	 *
+	 * The config/autoload.php file contains an array that permits sub-systems,
+	 * libraries, plugins, and helpers to be loaded automatically.
+	 *
+	 * @access	private
+	 * @param	array
+	 * @return	void
+	 */
+	function _ci_autoloader()
+	{	
+		include(APPPATH.'config/autoload'.EXT);
+		
+		if ( ! isset($autoload))
+		{
+			return FALSE;
+		}
+		
+		// Load any custom config file
+		if (count($autoload['config']) > 0)
+		{			
+			$CI =& get_instance();
+			foreach ($autoload['config'] as $key => $val)
+			{
+				$CI->config->load($val);
+			}
+		}		
+
+		// Autoload plugins, helpers, scripts and languages
+		foreach (array('helper', 'plugin', 'script', 'language') as $type)
+		{			
+			if (isset($autoload[$type]) AND count($autoload[$type]) > 0)
+			{
+				$this->$type($autoload[$type]);
+			}		
+		}
+
+		// Autoload models
+		if (isset($autoload['model']))
+		{
+			$this->model($autoload['model']);
+		}
+
+		// A little tweak to remain backward compatible
+		// The $autoload['core'] item was deprecated
+		if ( ! isset($autoload['libraries']))
+		{
+			$autoload['libraries'] = $autoload['core'];
+		}
+		
+		// Load libraries
+		if (isset($autoload['libraries']) AND count($autoload['libraries']) > 0)
+		{
+			// Load the database driver.
+			if (in_array('database', $autoload['libraries']))
+			{
+				$this->database();
+				$autoload['libraries'] = array_diff($autoload['libraries'], array('database'));
+			}
+
+			// Load scaffolding
+			if (in_array('scaffolding', $autoload['libraries']))
+			{
+				$this->scaffolding();
+				$autoload['libraries'] = array_diff($autoload['libraries'], array('scaffolding'));
+			}
+		
+			// Load all other libraries
+			foreach ($autoload['libraries'] as $item)
+			{
+				$this->library($item);
+			}
+
+			// Load the model class.
+			if (in_array('model', $autoload['libraries']))
+			{
+				$this->model();
+				$autoload['libraries'] = array_diff($autoload['libraries'], array('model'));
+			}
+		}		
+	}
+	
+	// --------------------------------------------------------------------
+
+	/**
+	 * Assign to Models
+	 *
+	 * Makes sure that anything loaded by the loader class (libraries, plugins, etc.)
+	 * will be available to models, if any exist.
+	 *
+	 * @access	private
+	 * @param	object
+	 * @return	array
+	 */
+	function _ci_assign_to_models()
+	{
+		if (count($this->_ci_models) == 0)
+		{
+			return;
+		}
+	
+		if ($this->_ci_is_instance())
+		{
+			$CI =& get_instance();
+			foreach ($this->_ci_models as $model)
+			{			
+				$CI->$model->_assign_libraries();
+			}
+		}
+		else
+		{		
+			foreach ($this->_ci_models as $model)
+			{			
+				$this->$model->_assign_libraries();
+			}
+		}
+	}  	
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Object to Array
+	 *
+	 * Takes an object as input and converts the class variables to array key/vals
+	 *
+	 * @access	private
+	 * @param	object
+	 * @return	array
+	 */
+	function _ci_object_to_array($object)
+	{
+		return (is_object($object)) ? get_object_vars($object) : $object;
+	}
+
+	// --------------------------------------------------------------------
+
+	/**
+	 * Determines whether we should use the CI instance or $this
+	 *
+	 * @access	private
+	 * @return	bool
+	 */
+	function _ci_is_instance()
+	{
+		if ($this->_ci_is_php5 == TRUE)
+		{
+			return TRUE;
+		}
+	
+		global $CI;
+		return (is_object($CI)) ? TRUE : FALSE;
+	}
+	
+}
+?>
\ No newline at end of file
